package campeonatofutebol.util;

import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.util.Log;
import campeonatofutebol.bean.Message;
import campeonatofutebol.bean.RepositorioDeDados;
import campeonatofutebol.bean.Time;

public class CarregadorDeFeeds {
	private String timeAtual;
	private String campeonatoAtual;
	private String classificacaoAtual;
	private String nomeJogosDaSemana;
	private String rssAtual;
	private static CarregadorDeFeeds _carregador;
	private  Map<String,URL> mensagens = new HashMap<String, URL>();

	private CarregadorDeFeeds(){

	}

	public static CarregadorDeFeeds getInstance(){
		return  _carregador == null ? _carregador = new CarregadorDeFeeds(): _carregador;
	}

	public Collection<String> carregaFeed(){
		List<String> resultado = new ArrayList<String>();
		try{
			BaseFeedParser parser = null;
			List<Message> messages = new ArrayList<Message>();
			if(classificacaoAtual != null){
				List<String> tabela = recuperaFeedDaClassificacao(getClassificacaoAtual());
				resultado = recuperaFeedDaClassificacao(getClassificacaoAtual());
				this.classificacaoAtual = null;
				return tabela; 
			} else if(nomeJogosDaSemana != null){
				List<String> jogosDaSemana = recuperaFeedDoJogosDaSemana();
				this.nomeJogosDaSemana = null;
				return jogosDaSemana;
			} else if(rssAtual != null) {
				Collection<String> r = carregaFeed(rssAtual);
				rssAtual = null;
				return r;
			}
			else{
				if(campeonatoAtual == null){
					if(timeComMaisDeUmFeed(getTimeAtual())) {
						parser = new BaseFeedParser(recuperaFeed1DoTime(getTimeAtual()));
						messages = parser.parse();
						parser = new BaseFeedParser(recuperaFeed2DoTime(getTimeAtual()));
						messages.addAll(parser.parse());
						Collections.sort(messages);
					} else {
						parser = new BaseFeedParser(recuperaFeed1DoTime(getTimeAtual()));
						messages = parser.parse();
					}
					timeAtual = null;
				}else{
					parser = new BaseFeedParser(recuperaFeedDoCampeonato(getCampeonatoAtual()));
					campeonatoAtual = null;
					messages = parser.parse();
				}
			}
			for (Message msg : messages){
				mensagens.put(msg.getTitle() + "\n\n " + msg.getDateToString(), msg.getLink());
				resultado.add( msg.getTitle() + "\n\n " + msg.getDateToString());
			}
		} catch (Throwable t){
			Log.e("AndroidNews",t.getMessage(),t);
		}

		return resultado;
	}

	public Collection<String> carregaFeed(String uri){
		List<String> resultado = new ArrayList<String>();
		try{
			BaseFeedParser parser = new DomBaseFeedParser(uri);
			List<Message> messages = parser.parse();
			for (Message msg : messages){
				resultado.add( msg.getTitle() + "\n\n " + msg.getDateToString());
			}
		} catch (Throwable t){
			Log.e("AndroidNews",t.getMessage(),t);
		}
		return resultado;
	}

	private boolean timeComMaisDeUmFeed(String timeSelec){
		boolean resp = false;
		if(timeSelec!= null){
			for (Time time : RepositorioDeDados.getInstance().getTimes()) {
				if(timeSelec.equals(time.getNome())){
					if(RepositorioDeDados.getInstance().getTimesComFeeds().get(time).size() == 2) {
						resp = true;
					}
				}
			}
		}
		return resp;
	}
	
	private  String recuperaFeed1DoTime(String timeSelec){
		String feed = null;
		if(timeSelec!= null){
			for (Time time : RepositorioDeDados.getInstance().getTimes()) {
				if(timeSelec.equals(time.getNome())){
					feed = RepositorioDeDados.getInstance().getTimesComFeeds().get(time).get(0);
				}
			}
		}
		return feed;
	}
	
	private  String recuperaFeed2DoTime(String timeSelec){
		String feed = null;
		if(timeSelec!= null){
			for (Time time : RepositorioDeDados.getInstance().getTimes()) {
				if(timeSelec.equals(time.getNome())){
					feed = RepositorioDeDados.getInstance().getTimesComFeeds().get(time).get(1);
				}
			}
		}
		return feed;
	}

	private String recuperaFeedDoCampeonato(String nomeCamp){
		String feed = null;
		if(nomeCamp != null){
			for (String campeonato : RepositorioDeDados.getInstance().getCampeonatos()) {
				if(nomeCamp.equals(campeonato)){
					feed = RepositorioDeDados.getInstance().getCampComFeeds().get(campeonato).get(0);
				}
			}
		}
		return feed;
	}

	private List<String> recuperaFeedDoJogosDaSemana(){
		RepositorioDeDados repositorio = RepositorioDeDados.getInstance();
		repositorio.getJogosDaSemana();
		List<String> jogosEncontrados = new ArrayList<String>();
		String dataJogo = null;
		for(String s: Config.recuperaDadosHtml(Constantes.UOL_JOGOS_SEMANA, "div.titulo > h3, .tab tr")){
			if(!verificaSeEhData(s)){
				dataJogo = s;
			}
			else{
				if(retiraHoraDoJogo(s)){
					jogosEncontrados.add(dataJogo + " as " + s.substring(0, 5) + "\n\n" + s.substring(6));
				}
				else{
					jogosEncontrados.add(dataJogo + "\n\n" + s);
				}
			}
		}
		return jogosEncontrados;
	}

	private boolean verificaSeEhData(String s){
		return s.contains(" x ");
	}

	private boolean retiraHoraDoJogo(String s){
		try{
			Integer.parseInt(s.substring(0, 1));
			return true;
		}
		catch(Exception e){
			return false;
		}
	}

	private List<String> recuperaFeedDaClassificacao(String nomeClassif){
		RepositorioDeDados repositorio = RepositorioDeDados.getInstance();
		if(nomeClassif.equals(RepositorioDeDados.getInstance().getClassificaoBrasileiraoSerieA().getNomeCLassificacao())){
			repositorio.getClassificaoBrasileiraoSerieA().buscarTodasPosicoes();
			return repositorio.getClassificaoBrasileiraoSerieA().getConteudoTabela();
		}
		else{
			repositorio.getClassificaoBrasileiraoSerieB().buscarTodasPosicoes();
			return repositorio.getClassificaoBrasileiraoSerieB().getConteudoTabela();
		}
	}

	public String getRssAtual() {
		return rssAtual;
	}

	public void setRssAtual(String uri) {
		rssAtual = uri;
	}

	public String getTimeAtual() {
		return timeAtual;
	}

	public void setTimeAtual(String timeAtual) {
		this.timeAtual = timeAtual;
	}

	public void setCampeonatoAtual(String nome) {
		this.campeonatoAtual = nome;
	}

	public String getCampeonatoAtual() {
		return campeonatoAtual;
	}

	public String getClassificacaoAtual(){
		return classificacaoAtual;
	}

	public void setClassificacaoAtual(String itemSelecionado) {
		this.classificacaoAtual = itemSelecionado;
	}

	public String getJogosDaSemanaAtual(){
		return this.nomeJogosDaSemana;
	}

	public void setJogosDaSemanaAtual(String nomeJogosDaSemana) {
		this.nomeJogosDaSemana = nomeJogosDaSemana;
	}

	public Map<String, URL> getMensagens() {
		return mensagens;
	}
}
